package threading;


//通过懒汉模式来创建单例类  ,  懒汉模式线程不安全
class SingletonLazy {
    //记得加上volatile，禁止指令重排序（也就是防止编译器优化）
    volatile private static SingletonLazy instance = null;

    public static SingletonLazy getInstance() {
        //注意第一个条件目的是判断是否需要加锁，如果已经有了对象，就不需要进行加锁了
        if(instance == null) {
            synchronized (SingletonLazy.class) {
                //这里是为了判断是否需要进行创建对象，两个条件代码一样，只是巧了，目的不一样
                if (instance == null) {
                    instance = new SingletonLazy();
                }

            }
        }
        return instance;
    }
    //私有的构造方法，类外获取不到
    private SingletonLazy() {

    }
}
public class ThreadDemo11Lazy {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();

        //此时s1和s2指向同一个对象
        System.out.println(s1 == s2);  //true
    }
}
